home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 3.2 / Ham Radio Version 3.2 (Chestnut CD-ROMs)(1993).ISO / packet / n17jsrc / tcptimer.c < prev    next >
C/C++ Source or Header  |  1991-02-06  |  1KB  |  58 lines

  1. /* TCP timeout routines
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include <stdio.h>
  5. #include "global.h"
  6. #include "mbuf.h"
  7. #include "timer.h"
  8. #include "netuser.h"
  9. #include "internet.h"
  10. #include "tcp.h"
  11.  
  12. int tcptimertype = 0;        /* default backoff to binary exponential */
  13.  
  14. /* Timer timeout */
  15. void
  16. tcp_timeout(p)
  17. void *p;
  18. {
  19.     register struct tcb *tcb;
  20.  
  21.     tcb = p;
  22.     if(tcb == NULLTCB)
  23.         return;
  24.  
  25.     /* Make sure the timer has stopped (we might have been kicked) */
  26.     stop_timer(&tcb->timer);
  27.  
  28.     switch(tcb->state){
  29.     case TCP_TIME_WAIT:    /* 2MSL timer has expired */
  30.         close_self(tcb,NORMAL);
  31.         break;
  32.     default:        /* Retransmission timer has expired */
  33.         tcb->flags.retran = 1;    /* Indicate > 1  transmission */
  34.         tcb->backoff++;
  35.         tcb->snd.ptr = tcb->snd.una;
  36.         /* Reduce slowstart threshold to half current window */
  37.         tcb->ssthresh = tcb->cwind / 2;
  38.         tcb->ssthresh = max(tcb->ssthresh,tcb->mss);
  39.         /* Shrink congestion window to 1 packet */
  40.         tcb->cwind = tcb->mss;
  41.         tcp_output(tcb);
  42.     }
  43. }
  44. /* Backoff function - the subject of much research */
  45. int32
  46. backoff(n)
  47. int n;
  48. {
  49.     if(n > 31)
  50.         n = 31;    /* Prevent truncation to zero */
  51.  
  52.     if(tcptimertype)
  53.         return (int32) ++n;    /* Linear backoff for sensible values! */
  54.     else
  55.         return 1L << n;    /* Binary exponential back off */
  56. }
  57.  
  58.